package org.zing.proxy.test02;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理工厂 - 动态创建代理对象 - 通过 Proxy.newProxyInstance 方法 创建代理对象
 *
 * @author zqx
 * @date 2024-04-21
 */
public class ProxyFactory {
    /**
     * 定义代理的目标对象 - 歌星
     */
    private final Performance target;

    public ProxyFactory(Performance target) {
        this.target = target;
    }

    /**
     * 获取代理对象
     *
     * @return 代理对象
     */
    public Performance getProxyObject() {
        /*
         * 实例化代理对象
         *
         *  ClassLoader loader ：类加载器，用于加载代理类。可以通过目标对象获取类加载器
         *  Class<?>[] interfaces ：代理对象实现接口的 Class 对象
         *  InvocationHandler h ：代理对象的调用处理程序 - 通过匿名内部类实现
         */
        return (Performance) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            /**
             * 代理方法
             *
             * @param proxy 代理对象
             * @param method 代理目标对象（真实对象）的核心方法
             * @param args 真实对象核心方法的实参列表
             * @return 真实对象核心方法的返回值
             * @throws Throwable 抛出异常
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("之前扩展：经纪人与客户谈合作，收取定金");
                return method.invoke(target, args);
            }
        });
    }

}
